home *** CD-ROM | disk | FTP | other *** search
/ Fifty: Elektronik / FIFTY Elektronik (PS_Computer_Vertrieb).iso / ps8 / fty1017 / gepackt.exe / DISK2 / PLOTSRC.EXE / PLGLOB.INC < prev    next >
Encoding:
Text File  |  1993-11-10  |  30.5 KB  |  1,181 lines

  1. Procedure InitColors;
  2. begin
  3.   If Not(MODECO80) then
  4.   begin
  5.     ModeWinCol:=CalcAttr(Crt.white,Crt.black);
  6.     ModeLowCol:=CalcAttr(Crt.White,Crt.black);
  7.     ModeNorCol:=CalcAttr(Crt.lightgray,Crt.black);
  8.     ModeFlpCol:=CalcAttr(Crt.black,Crt.lightgray);
  9.     ModeHiCol :=CalcAttr(Crt.White,Crt.black);
  10.     ModeHeadCol:=ModeLowCol;
  11.     MainWinCol:=ModeWinCol;
  12.     MainHeadCol:=ModeWinCol;
  13.     MainNorCol:=ModeNorCol;
  14.     MainLowCol:=ModeLowCol;
  15.     MainHiCol:=CalcAttr(Crt.White,Crt.black);
  16.     MainFlpCol:=ModeFlpCol;
  17.     BordCol:=ModeWinCol;
  18.     CopyWrCol:=ModeLowCol;
  19.     TitelCol:=ModeWinCol;
  20.     DiaWinCol:=Calcattr(Crt.black,Crt.LightGray);
  21.     DiaHeadCol:=DiaWinCol;
  22.   end;
  23. end;
  24.  
  25. PROCEDURE Border;
  26.   Var Soben,Sunten,Strenn,Srand:Str80;
  27.       I :Integer;
  28.   BEGIN  (*   Border  *)
  29.     clrscr;
  30.     Soben :='╔'+ConstStr('═',78)+'╗';
  31.     Srand :='║'+ConstStr(' ',78)+'║';
  32.     Sunten:='╚'+ConstStr('═',78)+'╝';
  33.     Strenn:='╠'+ConstStr('═',78)+'╣';
  34.     DisplayString(1,01,BordCol,Soben);
  35.     For I:=2 to 5 Do DisplayString(1,I,BordCol,Srand);
  36.     DisplayString(1,06,BordCol,Strenn);
  37.     For I:=7 to 23 Do DisplayString(1,I,BordCol,Srand);
  38.     DisplayString(1,24,BordCol,Sunten);
  39.     If HelpAvailable then
  40.       DisplayString(20,24,ModeLowCol,Center(' Hilfe : ALT-H oder SHIFT-ALT ',40));
  41.     DisplayString(4,3,TitelCol,Center(titel,74));
  42.     DisplayString(4,4,TitelCol,Center(titel2,74));
  43.     DisplayString(4,5,TitelCol,Center('V'+Version,74));
  44.     DisplayString(4,6,CopyWrCol,' '+copyright+' ');
  45.     DisplayString(70,6,CopyWrCol,' '+SetupInfo.Sernumber+' ');
  46.     ShowWindow(Men_Main.Picture);
  47.   END;  (*  Border  *)
  48.  
  49. Procedure Abbrechen;
  50. Var TC :Char;
  51. Begin
  52.   If Keypressed Then
  53.     Begin
  54.       If SelectError('Abbrechen ? J/N','',[Esc,'J','N'])='J' then
  55.         Weiter:=False
  56.     End;
  57. End;
  58.  
  59. Procedure OpenPrOut(Y :Integer;Var TC :Char);
  60. Var OutFname: Str64;
  61.     Makeit,FnameOk :Boolean;
  62.     S:Str80;
  63.     N,E :Str15;
  64. begin
  65.   NoError:=true;
  66.   DevMode:=false;
  67.   If OutPath=''then
  68.       OutPath:=ActivePath;
  69.   If Aufdatei then
  70.     begin
  71.       GotoXY(3,Y);Write('Ausgabe der Plot-Daten auf eine Datei');
  72.       GotoXY(3,Y+1);Write('Dateiname :');
  73.       OutFname:=HauptF+'.PLT';
  74.       ProcessFileName(Outpath,OutFname);
  75.       Repeat
  76.         Repeat
  77.           InputKbd(OutFname,50,16,Y+1,[^M,^Q,^Z,Esc],Alphas+DOSseparators,TC);
  78.           S:=OutFName;
  79.           S:=UpcaseStr(S);
  80.           FnameOK:=Pos(Dsuf,S)=0;
  81.           If Not(FnameOk) Then
  82.           begin
  83.             Beep;
  84.             GotoXY(3,Y+3);ClrEol;Write('Unzulässiger Dateiname');
  85.           end;
  86.         Until FnameOk Or (TC=Esc);
  87.         GotoXY(3,Y+3);ClrEol;
  88.         If TC<>Esc Then
  89.         begin
  90.           {$I-}
  91.           Assign(PrOutFile,OutFName);
  92.       Repeat
  93.             Reset(PrOutFile);
  94.         IOstatus:=IoResult;
  95.         Ok:=IoStatus=0;
  96.       Until Not(OpenError);
  97.           Makeit:=true;
  98.           If Ok Then
  99.             begin
  100.               Close(PrOutFile);
  101.               If SelectError('Datei vorhanden,überschreiben ? J/N',
  102.                              'Warnung:',['J','N',Esc])='J' then Makeit:=true
  103.               else begin TC:=Esc; Makeit:=false; end;
  104.            end;
  105.          If Makeit Then
  106.          begin
  107.            Assign(PrOutFile,OutFName);
  108.        Repeat
  109.             Rewrite(PrOutFile);
  110.         IOstatus:=IoResult;
  111.         Ok:=IoStatus=0;
  112.            Until Not(OpenError);
  113.            If Not(Ok) Then
  114.            begin
  115.              TC:=SelectError('Datei kann nicht erzeugt werden  - <Esc>',
  116.                             'Fehler:',[Esc]);
  117.            end else
  118.             begin
  119.              SetDeviceBinary(PrOutFile);
  120.              Fsplit(OutFname,OutPath,N,E);
  121.              NormFname(OutPath);
  122.             end;
  123.          end;
  124.         {$I+}
  125.         end;
  126.       Until  Ok or (TC=Esc);
  127.      If Not(Ok and (TC<>Esc)) then TC:=Esc;
  128.      end
  129.      else
  130.       begin
  131.     With SetupInfo.PinstInfo Do
  132.     begin
  133.           DevMode:=OutDevice<>'';
  134.           AufDatei:=DevMode;
  135.           {$I-}
  136.           If DevMode then
  137.            Assign(PrOutFile,OutDevice)
  138.           else
  139.            begin
  140.              If Serial Then
  141.              begin
  142.                 CTS_Handshake:=Xonoff=2;
  143.                 DSR_Handshake:=Xonoff=1;
  144.                 XonXoff:=(xonoff<>1) and (xonoff<>2);
  145.             AssignAUX(PrOutFile,SerPortNr,Baudrate,
  146.                     Stopbits,Databits,Parity)
  147.  
  148.              end
  149.          else
  150.             AssignLST(PrOutFile,PlotterNr);
  151.            end;
  152.           Rewrite(PrOutFile);
  153.           Noerror:=Ioresult=0;
  154.           {$I+}
  155.           SetDeviceBinary(PrOutFile);
  156.           TC:=#0;
  157.           If OutDevice<>'' then
  158.            begin
  159.             GotoXY(3,Y+1);Write('Dateiname :',OutDevice);
  160.            end;
  161.         End;
  162.       end;
  163. end;
  164.  
  165. Procedure ClosePrOut;
  166. begin
  167.   If AufDatei Then
  168.    If NoError Then
  169.      begin {$I-}
  170.        Write(PrOutFile,^Z);{ EOF-Markierung }
  171.        NoError:=IOresult=0;
  172.      end;
  173.   Close(PrOutFile);
  174.   If AufDatei Then
  175.     begin
  176.       If DevMode then Aufdatei:=false;
  177.       Noerror:=NoError And (Ioresult=0);
  178.       If Not(NoError) then
  179.       begin
  180.         TC:=SelectError('Fehler beim Schreiben der Datei  - <Esc>','',[Esc]);
  181.       end;
  182.    end;
  183.    {$I+}
  184. end;
  185.  
  186. Function DateStr(Var TimeDate:DateRec):Str40;
  187. Var Sy,Sd,Sm:Str15;
  188. begin
  189.   With TimeDate Do
  190.   begin
  191.     Str(Year,Sy);
  192.     Str(Month,Sm);
  193.     Str(Day,Sd);
  194.     DateStr:=Sd+'.'+Sm+'.'+Sy;
  195.   end;
  196. end;
  197.  
  198. Function TimeStr(Var TimeDate:DateRec):Str40;
  199. Var Sh,Sm:Str15;
  200. begin
  201.   With TimeDate Do
  202.   begin
  203.     Str(Hour,Sh);
  204.     Str(Minutes,Sm);
  205.     Sm:='00'+Sm;
  206.     While Length(Sm)>2 do Delete(Sm,1,1);
  207.     TimeStr:=Sh+':'+Sm;
  208.   end;
  209. end;
  210.  
  211. Function VersionStr(V:Integer):Str40;
  212. Var S :Str40;
  213. begin
  214.   RealStr(V/10.0,6,S);
  215.   VersionStr:=S;
  216. end;
  217.  
  218. Function ArbeitsZeitStr(T :Longint):Str40;
  219. Var H,M :Longint;
  220.     Sm,Sh :Str15;
  221. begin
  222.   T:=T div 60; { Minuten }
  223.   H:= T div 60;
  224.   M:= T mod 60;
  225.   Str(H,Sh);
  226.   Str(M,Sm);
  227.   Sm:='00'+Sm;
  228.   While Length(Sm)>2 do Delete(Sm,1,1);
  229.   ArbeitsZeitStr:=Sh+' h: '+Sm+' min';
  230. end;
  231.  
  232. Procedure Mirror(Var Px,Py :integer; Spiegel :Spiegelpar);
  233. Var P1,P2 :Real;
  234. begin
  235.   P1:=Px;
  236.   P2:=Py;
  237.   With Spiegel Do
  238.   begin
  239.     Px:=RealtoInt(A11*P1+A12*P2+Ex);
  240.     Py:=RealtoInt(A21*P1+A22*P2+Ey);
  241.   end;
  242. end;
  243.  
  244. Procedure Spiegle_Obj(Var Objekt :Bildelement;Var Spiegel :Spiegelpar);
  245.  
  246. Var Ax,Ay,Temp,Phi_Korr :Integer;
  247.  
  248. Begin
  249.   With Objekt Do
  250.   Begin
  251.     Case ElementTyp of
  252.       Kreis,
  253.       M_arc    :  begin
  254.                     Temp:=Segmentalpha;
  255.                     Segmentalpha:=-Segmentbeta;
  256.                     Segmentbeta:=-temp;
  257.                   end;
  258.       Rechteck :begin
  259.                   Ax:=0;
  260.                   Ay:=Rbreite;
  261.                   Turnto(Orient);
  262.                   Rotate(Ax,Ay);
  263.                   Inc(Aufhaenger.X,Ax);
  264.                   Inc(Aufhaenger.Y,Ay);
  265.                 end;
  266.  
  267.       Linie,
  268.       M_line   :Mirror(Endpunkt.X,Endpunkt.Y,Spiegel);
  269.       Schrift,
  270.       M_text   :begin
  271.                   If Spiegel.MirrText then
  272.                     begin
  273.                       Phi_Korr:=180;
  274.                       Art:=Art xor 2 { Spiegel-Bit umkehren}
  275.                     end
  276.                   else
  277.                     begin
  278.                       Ay:=0;
  279.                       Ax:=0;
  280.                       Phi_Korr:=0;
  281.                       With Spiegel Do
  282.                       If (PhiAxis>=315) or (PhiAxis<=45) Then
  283.                         Ay:=RealtoInt(Hoehe)
  284.                        else
  285.                        begin
  286.                         Ax:=TextLaenge(Objekt);
  287.                         Phi_Korr:=180;
  288.                        end;
  289.                       Turnto(Orient);
  290.                       Rotate(Ax,Ay);
  291.                       Inc(Aufhaenger.X,Ax);
  292.                       Inc(Aufhaenger.Y,Ay);
  293.                     end;
  294.                     Dec(Orient,Phi_Korr);
  295.                  end;
  296.       MassPfeil: begin
  297.                    Ax:=RealtoInt(Msize*Masslaenge);
  298.                    Ay:=0;
  299.                    Turnto(Orient);
  300.                    Rotate(Ax,Ay);
  301.                    Inc(Aufhaenger.X,Ax);
  302.                    Inc(Aufhaenger.Y,Ay);
  303.                    Dec(Orient,180);
  304.                   end;
  305.       Macro    : begin Faktor:=-Faktor; Dec(Orient,180); end;
  306.     End;
  307.     Mirror(Aufhaenger.X,Aufhaenger.Y,Spiegel);
  308.     If Elementtyp<>Auge Then Orient:=Spiegel.PhiAxis*2-Orient;
  309.     Normalize(Orient);
  310.   End;
  311. End;
  312.  
  313.  
  314. Procedure Zeichne(Objekt :Bildelement;MacWert :Macparms);
  315. Var Phi           :Integer;
  316.     X0,Y0,Mass1,
  317.     Mass2,Groesse :Real;
  318.     Color  :GrColor;
  319.  Function  PlStretch(X:Integer;Scale :Real) :Real;
  320.  Begin
  321.    With SetupInfo.Voreinstellung Do
  322.    PlStretch:=Scale*PlotScale*Einheit*X;
  323.  End;
  324.  Function SetLbreite(B:Integer):Real;
  325.  begin
  326.    If B=0 then
  327.       SetLbreite:=0
  328.      else
  329.       SetLbreite:=PlStretch(B,Groesse)+LoetstopPlus;
  330.  end;
  331.  
  332.  Procedure Transform(Var X,Y :Real);
  333.  Var Xp,Yp :real;
  334.  Begin
  335.   With MacWert Do
  336.   If TMac Then
  337.   Begin
  338.     Turnto(Phi);
  339.     Xp:=Mfac*X;              Yp:=Mfac*Y;
  340.     Rotreal(Xp,Yp);
  341.     X:=Xp+Xmac;Y:=Yp+Ymac;
  342.   End;
  343.   With SetupInfo.Voreinstellung Do
  344.   Begin
  345.     X:=(X-Ursprung.X)*PlotScale*Einheit;
  346.     Y:=(Y-Ursprung.Y)*PlotScale*Einheit;
  347.   End;
  348.     X:=X+PlotOffset.X;
  349.     Y:=Y+PlotOffset.Y;
  350.  End;
  351.  Procedure PaintAuge;
  352.  var Mass3 :Real;
  353.  Begin
  354.   With Objekt Do
  355.    Begin
  356.      If ElementTyp=Quadrat then Exchange(AussenD,InnenD);
  357.      Mass1:=PlotLimit(PlStretch(AussenD,Groesse)-Stiftbreite);
  358.      Mass2:=PlStretch(InnenD,Groesse);
  359.      If ElementTyp=Oval then
  360.         Mass3:=PlStretch(Oval_len,Groesse)-Stiftbreite
  361.        else
  362.         Mass3:=0;
  363.      If  PlotModus=LoetStop then
  364.        begin
  365.          Mass1:=Mass1+Loetstopplus;
  366.          Mass2:=0;
  367.          Mass3:=Mass3+Loetstopplus;
  368.        End;
  369.      Transform(X0,Y0);
  370.      If ElementTyp<>Auge then Turnto(Orient+Phi)
  371.       else Turnto(0);
  372.      Case Elementtyp of
  373.        Auge:   Eye(X0,Y0,Mass1,Mass2,Color);
  374.        Quadrat:SqareEye(X0,Y0,Mass1,Mass2,Color);
  375.        Oval   :OvalEye(X0,Y0,Mass1,Mass2,Mass3,Color);
  376.        Achteck:Octagon(X0,Y0,Mass1,Mass2,Color);
  377.      end;
  378.    End;
  379.  End;
  380.  Procedure PaintKreis;
  381.  Var Decr : Real;
  382.      LB   :Real;
  383.      Min1,Min2  :Real;
  384.      Direction,Ende,Einmal:Boolean;
  385.      Cx,Cy,Rx,Ry :real;
  386.      Procedure ArcKoord(rx,ry:Real;Phi :Integer);
  387.      begin
  388.        SinusCosinus(Phi,CY,CX);
  389.        CX:=CX*RX;CY:=CY*Ry;
  390.        RotReal(CX,CY);
  391.        CX:=CX+X0;
  392.        CY:=CY+Y0;
  393.      end;
  394.  Begin
  395.   Direction:=True;
  396.   Decr:=0.75*Stiftbreite;
  397.   If Decr<0.05 then Decr:=0.05;
  398.   With Objekt Do
  399.     Begin
  400.       LB:=Setlbreite(Kbreite)-Stiftbreite;
  401.       Einmal:=LB<=0;
  402.       If Einmal then LB:=0;
  403.       Rx:=PlotLimit(PlStretch(HalbX,Groesse));
  404.       Ry:=PlotLimit(PlStretch(HalbY,Groesse));
  405.       LB:=0.5*LB;
  406.       Min1:=Rx-LB;
  407.       Min2:=Ry-LB;
  408.       Mass1:=Rx+LB;
  409.       Mass2:=Ry+LB;
  410.       If Sectorfill then
  411.       begin
  412.         Min1:=0.1;
  413.         Min2:=0.1;
  414.         Einmal:=false;
  415.       end;
  416.       If PlotModus=TestPlot then
  417.       begin
  418.         If Sectorfill then
  419.           begin
  420.            Decr:=(Mass1+Mass2)*0.1;
  421.            If Decr<2*Stiftbreite then Decr:=2*Stiftbreite;
  422.           end
  423.           else Decr:=2*LB+0.0001;
  424.       end;
  425.       LineType(LTyp);
  426.       Transform(X0,Y0);Turnto(Orient+Phi);
  427.       Repeat
  428.        Ende:=((Mass1<Min1)) or ((Mass2<Min2));
  429.        If Ende then
  430.          begin
  431.            Mass1:=Min1;
  432.            Mass2:=Min2;
  433.          end;
  434.        Circle(X0,Y0,Mass1,Mass2,SegmentAlpha,SegmentBeta,Color,Direction);
  435.        Direction:=Not(direction);
  436.        Mass1:=Mass1-Decr;Mass2:=Mass2-Decr;
  437.       Until Ende or Einmal;
  438.       If (SectorFill or (LB>0.1)) and (Segmentbeta-SegmentAlpha<>360) Then
  439.       begin
  440.         If (Sectorfill) and (PlotModus=TestPlot) then
  441.         begin
  442.           ArcKoord(Rx,Ry,Segmentbeta);
  443.           Pencolor(0);
  444.           Moveto(Cx,Cy);
  445.           Pencolor(Color);
  446.           Moveto(X0,Y0);
  447.           ArcKoord(Rx,Ry,Segmentalpha);
  448.           Pencolor(Color);
  449.           Moveto(Cx,Cy);
  450.         end
  451.         else
  452.           If AdaptLines then
  453.           begin
  454.             ArcKoord(Rx,Ry,SegmentAlpha);
  455.             Eye(CX,Cy,2.0*LB,0,Color);
  456.             ArcKoord(Rx,Ry,SegmentBeta);
  457.             Eye(CX,Cy,2.0*LB,0,Color);
  458.           end
  459.           else If PlotModus=Testplot then
  460.             begin
  461.               ArcKoord(Rx-LB,Ry-LB,SegmentAlpha);
  462.               Pencolor(0); Moveto(CX,Cy);
  463.               ArcKoord(Rx+LB,RY+LB,SegmentAlpha);
  464.               Pencolor(Color); Moveto(CX,Cy);
  465.               ArcKoord(Rx-LB,RY-LB,Segmentbeta);
  466.               Pencolor(0); Moveto(CX,Cy);
  467.               ArcKoord(RX+LB,RY+LB,Segmentbeta);
  468.               Pencolor(Color); Moveto(CX,Cy);
  469.             end;
  470.       end;
  471.       LineType(full);
  472.     End;
  473.   End;
  474.   Procedure Paint4eck;
  475.   Var DL,Bx,By,
  476.      Margin :Real;
  477.  
  478.   Begin
  479.     With Objekt Do
  480.       Begin
  481.         LineType(LTyp);
  482.         If Rfill Then
  483.          Begin
  484.            If RLaenge>RBreite Then
  485.              Margin:= Rbreite
  486.            Else
  487.              Margin:=RLaenge;
  488.            Margin:=0.5*Margin;
  489.          End
  490.         Else
  491.           Margin:=Rand;
  492.         Transform(X0,Y0);Turnto(Phi+Orient);
  493.         Mass1:=PlotLimit(PlStretch(RLaenge,Groesse));
  494.         Mass2:=PlotLimit(PlStretch(RBreite,Groesse));
  495.         With SetupInfo.Voreinstellung Do
  496.           Margin:=PlotLimit(Groesse*PlotScale*Einheit*Margin);
  497.         If (Rand>0) or Rfill then
  498.           DL:=StiftBreite
  499.         else
  500.           DL:=0;
  501.         If PlotModus=LoetStop then
  502.           begin
  503.             DL:=DL-LoetstopPlus;
  504.             Margin:=Margin+LoetstopPlus;
  505.           end;
  506.         Mass1:=Mass1-Dl;
  507.         If Mass1<0 then Mass1:=0;
  508.         Mass2:=Mass2-Dl;
  509.         If Mass2<0 then Mass2:=0;
  510.         Bx:=DL*0.5;By:=Bx;
  511.         RotReal(Bx,By);
  512.         X0:=Bx+X0;Y0:=By+Y0;
  513.         Rectangle(X0,Y0,Mass1,Mass2,Margin,Color);
  514.         LineType(full);
  515.       End;
  516.   End;
  517.   Procedure PaintLine;
  518.   Var XE,YE,
  519.       B     :Real;
  520.   Begin
  521.     With Objekt Do
  522.       Begin
  523.         LineType(LTyp);
  524.         XE:=Endpunkt.X;YE:=Endpunkt.Y;
  525.         Transform(X0,Y0);
  526.         Transform(XE,YE);
  527.         Pencolor(0);Moveto(X0,Y0);
  528.         If Ltyp<>full Then
  529.         Begin
  530.           Pencolor(Color);Moveto(XE,YE);
  531.           Pencolor(0);
  532.          End
  533.         Else
  534.           begin
  535.             With SetupInfo.Voreinstellung Do
  536.               B:=SetLbreite(Lbreite);
  537.             Linepaint(X0,Y0,XE,YE,B,Color,AdaptLines);
  538.           end;
  539.         Pencolor(0);
  540.         LineType(full);
  541.       End;
  542.   End;
  543.   Procedure PaintText;
  544.   Var H :Real;
  545.       S :Str64;
  546.   Begin
  547.   With Objekt Do
  548.     Begin
  549.       With SetupInfo.Voreinstellung Do
  550.       H:=PlotScale*Einheit*Hoehe*Groesse;
  551.       Transform(X0,Y0);
  552.       Turnto(Phi+Orient);
  553.       If (Length(Wortlaut)>1) and (Wortlaut[1]='#') then
  554.          begin
  555.           Case Upcase(WortLaut[2]) of
  556.            'Z'  : S:=TimeStr(DateInfo.Updated);
  557.            'D'  : S:=DateStr(DateInfo.Updated);
  558.            'V'  : S:=VersionStr(DateInfo.Orient);
  559.            'A'  : S:=ArbeitsZeitStr(DateInfo.WorkingTime);
  560.            'T'  : S:=TimeStr(DateInfo.Created);
  561.            'E'  : S:=DateStr(DateInfo.Created);
  562.            'N'  : S:=Filesetup.DWG+Dsuf;
  563.            'P'  : S:=FileSetup.DWGpath;
  564.            'B'  : S:=FileSetup.Libpath;
  565.            else S:=Wortlaut;
  566.           end;
  567.           Wstring(X0,Y0,S,Color,H,Art);
  568.         end else Wstring(X0,Y0,Wortlaut,Color,H,Art);
  569.     End;
  570.   End;
  571. Procedure PaintPfeil;
  572. Begin
  573.   With Objekt Do
  574.   Begin
  575.     Transform(X0,Y0);
  576.     Turnto(Phi+Orient);
  577.     With SetupInfo.Voreinstellung do
  578.       Pfeil(X0,Y0,Einheit*Masslaenge,Msize*Groesse*PlotScale,Masstext,Color);
  579.   End;
  580. End;
  581.  
  582. Procedure PaintSpitze;
  583. Begin
  584.   With Objekt  Do
  585.   Begin
  586.     LineType(Ltyp);
  587.     With SetupInfo.Voreinstellung Do
  588.       MP_Hoehe:=PlotScale*Einheit*MP_Hoehe*Groesse;
  589.     Transform(X0,Y0);
  590.     Turnto(Phi+Orient);
  591.     PfeilSpitze(X0,Y0,MP_Hoehe,Color);
  592.   End;
  593. End;
  594.  
  595. Begin
  596.   With Objekt Do
  597.   Begin
  598.    If Ebene in PlotLayers Then
  599.    Begin
  600.     If Macwert.MirMac then
  601.       Spiegle_Obj(Objekt,Yaxis);
  602.     Groesse:=Macwert.Mfac;
  603.     Phi:=Macwert.MPhi;
  604.     Color:=GrColor(EbenenIndex(Ebene));
  605.     Pencolor(Color);
  606.     X0:=Aufhaenger.X;
  607.     Y0:=Aufhaenger.Y;
  608.     Case ElementTyp of
  609.       Auge,
  610.       Quadrat,
  611.       Oval,
  612.       achteck  :PaintAuge;
  613.       Kreis,
  614.       M_arc    :PaintKreis;
  615.       Rechteck :Paint4eck;
  616.       Linie,
  617.       M_line   :PaintLine;
  618.       Schrift,
  619.       M_text    :PaintText;
  620.       Masspfeil :PaintPfeil;
  621.       M_Peek    :PaintSpitze;
  622.       Macro    :Begin
  623.                   Transform(X0,Y0);
  624.                   Wstring(X0,Y0,Fullname_O(Objekt),Color,2.5,0);
  625.                 End;
  626.     End;
  627.    End;
  628.   End;
  629.   Pencolor(0);
  630. End;
  631.  
  632. Procedure Change(Var Objekt :Bildelement;MacWert :Macparms);
  633. Var Phi      :Integer;
  634.     Groesse  :Real;
  635.  Procedure Transform(Var X,Y :Integer);
  636.  Var Xp,Yp :real;
  637.  Begin
  638.   Turnto(Phi);
  639.   With MacWert Do
  640.   Begin
  641.     Xp:=Mfac*X;
  642.     Yp:=Mfac*Y;
  643.     Rotreal(Xp,Yp);
  644.     X:=RealtoInt(Xp)+Xmac;Y:=RealtoInt(Yp)+Ymac;
  645.   End;
  646.  End;
  647.  Procedure ChangeAuge;
  648.  Begin
  649.   With Objekt Do
  650.    Begin
  651.      If Elementtyp<>Auge then
  652.        Orient:=Orient+Phi;
  653.      If elementTyp=Oval then
  654.        Oval_len:=RealtoInt(Groesse*Oval_Len);
  655.      AussenD:=Minimal(RealtoInt(Groesse*AussenD));
  656.      InnenD:=RealtoInt(Groesse*InnenD);
  657.    End;
  658.  End;
  659.  Procedure ChangeQuad;
  660.  Begin
  661.   With Objekt Do
  662.     Begin
  663.       Qbreite:=Minimal(RealtoInt(Groesse*Qbreite));
  664.       QinnenD:=RealtoInt(Groesse*QinnenD);
  665.       
  666.     End;
  667.  End;
  668.  Procedure ChangeKreis;
  669.  Begin
  670.   With Objekt Do
  671.     Begin
  672.       Kbreite:=RealtoInt(Groesse*Kbreite);
  673.       HalbX:=Minimal(RealtoInt(Groesse*HalbX));
  674.       HalbY:=Minimal(RealtoInt(Groesse*HalbY));
  675.       Orient:=Orient+Phi;
  676.     End;
  677.   End;
  678.   Procedure Change4eck;
  679.   Begin
  680.     With Objekt Do
  681.       Begin
  682.         Orient:=Phi+Orient;
  683.         Rlaenge:=Minimal(RealtoInt(Groesse*RLaenge));
  684.         Rbreite:=Minimal(RealtoInt(Groesse*RBreite));
  685.         Rand:=RealtoInt(Groesse*Rand);
  686.       End;
  687.   End;
  688.   Procedure ChangeLine;
  689.   Begin
  690.     With Objekt Do
  691.       Begin
  692.         Lbreite:=RealtoInt(Groesse*Lbreite);
  693.         Transform(Endpunkt.X,Endpunkt.Y);
  694.       End;
  695.   End;
  696.   Procedure Changetext;
  697.   Begin
  698.   With Objekt Do
  699.     Begin
  700.       Hoehe:=Groesse*Hoehe;
  701.       Orient:=Phi+Orient;
  702.     End;
  703.   End;
  704. Procedure ChangePfeil;
  705. Begin
  706.   With Objekt Do
  707.   Begin
  708.     Orient:=Phi+Orient;
  709.     Msize:=Msize*Groesse;
  710.   End;
  711. End;
  712. Procedure ChangePeek;
  713. Begin
  714.   With Objekt Do
  715.   Begin
  716.     Orient:=Phi+Orient;
  717.     MP_hoehe:=MP_Hoehe*Groesse;
  718.   End;
  719. End;
  720. Begin
  721.   With Objekt Do
  722.   Begin
  723.     If Macwert.MirMac then
  724.       Spiegle_Obj(Objekt,Yaxis);
  725.     Groesse:=Macwert.Mfac;
  726.     Phi:=Macwert.MPhi;
  727.     Transform(Aufhaenger.X,Aufhaenger.Y);
  728.     Case ElementTyp of
  729.       Auge,
  730.       Achteck,
  731.       Oval      :ChangeAuge;
  732.       Quadrat   :ChangeQuad;
  733.       Kreis,
  734.       M_arc     :ChangeKreis;
  735.       Rechteck  :Change4eck;
  736.       Linie,
  737.       M_line    :ChangeLine;
  738.       Schrift,
  739.       M_text    :ChangeText;
  740.       Masspfeil :ChangePfeil;
  741.       M_peek    :Changepeek;
  742.     End;
  743.   End;
  744. End;
  745.  
  746. Procedure GetLastKoord;
  747. Var X,Y :Real;
  748. begin
  749.   X:=GrOldX;Y:=GrOldY;
  750.   Retourabbild(X,Y);
  751.   With SetupInfo.Voreinstellung Do
  752.   begin
  753.     LastKoord.X:=
  754.     RealtoInt((X-PlotOffset.X*InvPlotRes)*BackScale)+Ursprung.X;
  755.     LastKoord.Y:=
  756.     RealtoInt((Y-PlotOffset.Y*InvPlotRes)*BackScale)+Ursprung.Y;
  757.  end;
  758. end;
  759.  
  760. Function Abstand(P1,P2 :Koord):Integer;
  761. { Manhattan-Distanz }
  762. begin
  763.   Abstand:=Abs(P1.X-P2.X)+Abs(P1.Y-P2.Y);
  764. end;
  765.  
  766. Function PrepareSearch(Max :Integer):Boolean;
  767. Var I :Integer;
  768.     IsWas :Boolean;
  769. begin
  770.   IsWas:=false;
  771.   For I:=0 to Max Do
  772.     With BildBuff[I] do
  773.       If Status=0 Then
  774.       begin Status:=2; IsWas:=true; end;
  775.       { Status=2 bedeutet :Freigabe zum Zeichnen}
  776.   PrepareSearch:=IsWas;
  777. end;
  778.  
  779. Function MinSearch(Max :Integer):Integer;
  780. Var I,Dist,Abst,IMin :Integer;
  781.     Temp :Koord;
  782.     Endp :Boolean;
  783.   Procedure Check(Var B :Bildelement);
  784.   begin
  785.     If B.Status=2 Then
  786.         begin
  787.           Abst:=Abstand(B.Aufhaenger,LastKoord);
  788.           If Abst<Dist Then
  789.           begin
  790.             Dist:=Abst;
  791.             Imin:=I;
  792.             Endp:=false;
  793.           end;
  794.           If B.ElementTyp in [Linie,M_line] Then
  795.           begin
  796.             Abst:=Abstand(B.Endpunkt,LastKoord);
  797.             If Abst<Dist Then
  798.               begin
  799.                 Dist:=Abst;
  800.                 Imin:=I;
  801.                 Endp:=true;
  802.               end;
  803.           end;
  804.        end;
  805.   end;
  806. begin
  807.   Dist:=Maxint;
  808.   Imin:=-1;
  809.   Endp:=false;
  810.   GetLastKoord;
  811.   For I:=0 to Max Do Check(BildBuff[I]);
  812.   If Imin>-1 Then
  813.    begin
  814.     With BildBuff[Imin] Do
  815.       If (ElementTyp in [Linie,M_line]) and Endp Then
  816.        begin Temp:=Aufhaenger; Aufhaenger:=Endpunkt; Endpunkt:=Temp; end;
  817.    end;
  818.   MinSearch:=Imin;
  819. end;
  820.  
  821. Procedure SelectPen(Stift:Integer);
  822. Var E:Integer;
  823.    Done:Boolean;
  824. begin
  825.   E:=0;
  826.   Repeat
  827.     If E in LayersetofPen[Stift]  Then
  828.     begin
  829.       PenColor(EbenenIndex(E));
  830.       Done:=true;
  831.     end;
  832.     E:=Succ(E);
  833.   Until Done or (E>MaxLayer);
  834. end;
  835.  
  836. Procedure CrunchBuffer(Max :Integer);
  837. Var I,J :Integer;
  838.     Done,
  839.     FoundValid :Boolean;
  840. begin
  841.   I:=0;
  842.   Done:=false;
  843.   Repeat
  844.     With BildBuff[I] do
  845.       If Status=1 then
  846.         begin
  847.           FoundValid:=false;
  848.           J:=I;
  849.           While (J<Max) and Not(Foundvalid) Do
  850.           begin
  851.             Inc(J,1);
  852.             If BildBuff[J].Status<>1 then
  853.               begin
  854.                 BildBuff[I]:=BildBuff[J];
  855.                 Status:=0;
  856.                 BildBuff[J].Status:=1;
  857.                 FoundValid:=true;
  858.               end else If J=Max then
  859.                           Done:=true;
  860.           end;
  861.         end else Status:=0;
  862.     Inc(I,1);
  863.   Until (I>Max)  or Done;
  864.   BuffPtr:=0;
  865.   While (BildBuff[BuffPtr].Status<>1) and (BuffPtr<=Max) Do Inc(BuffPtr);
  866. end;
  867.  
  868. Procedure ZeichneaufBuf(Var Bild :Bildelement;Clearit :Boolean);
  869. Var Clear :Boolean;
  870.     Max,K   :Integer;
  871.     N_Drawn :Integer;
  872. Begin
  873.   Clear:=false;
  874.   If Not(ClearIt) Then
  875.   Begin
  876.     If Buffptr<0 Then Buffptr:=0
  877.     Else
  878.       If Buffptr>MaxBuf Then Buffptr:=MaxBuf;
  879.     UsedLayers:=UsedLayers+[Bild.Ebene];
  880.     If Bild.Ebene in PlotLayers then
  881.      If  Bild.Ebene in LayerSetofPen[Actual_StiftNr]  Then
  882.        Begin
  883.          BildBuff[Buffptr]:=Bild;
  884.          Inc(Buffptr,1);
  885.          Clear:=BuffPtr>MaxBuf;
  886.        End;
  887.     If Clear Then Begin Max:=MaxBuf;Buffptr:=0;End;
  888.     Abbrechen;
  889.   End
  890.   Else
  891.     Begin
  892.       Clear:=true;
  893.       Max:=Buffptr-1;
  894.       Buffptr:=0;
  895.     End;
  896.   If Clear Then
  897.   Begin
  898.     N_Drawn:=0;
  899.     If LayerSetofPen[Actual_StiftNr]<>[] Then
  900.      If PrepareSearch(Max) Then
  901.      begin
  902.       Stiftbreite:=StiftBreiten[Actual_StiftNr];
  903.       Repeat
  904.         K:=MinSearch(Max);
  905.         If K>-1 Then
  906.           Begin
  907.             Inc(Actual_ObjNr,1);
  908.             If (Actual_ObjNr and 7)=0 Then
  909.               begin
  910.                 With Plot_win Do
  911.                  DisplayReal(X1+32,Y1+6,PlotHeadCol,Actual_ObjNr,6,0,false);
  912.                end;
  913.             Zeichne(BildBuff[K],DefMacparms);
  914.             BildBuff[K].Status:=1; { bearbeitet }
  915.             Inc(N_Drawn,1);
  916.             If (N_Drawn>MaxBuf div 2) and Not(ClearIt) then
  917.                begin
  918.                  CrunchBuffer(Max);
  919.                  Exit;
  920.                end;
  921.           End;
  922.         Abbrechen;
  923.       Until (K<0) or Not(Weiter) or Not(NoError);
  924.     end;
  925.   End;
  926. End;
  927.  
  928. Procedure GetMacparms(Var Objekt :Bildelement;Var Parms :Macparms);
  929. Begin
  930.   With Parms Do
  931.   Begin
  932.     XMac:=Objekt.Aufhaenger.X;YMac:=Objekt.Aufhaenger.Y;
  933.     MPhi:=Objekt.Orient;MFac:=Abs(Objekt.Faktor);
  934.     TMac:=true;
  935.     MirMac:=Objekt.Faktor<0;
  936.   End;
  937. End;
  938.  
  939. Procedure MakePart(M:Bildelement;Var P :Bildelement);
  940. { erzeugt Part-ID-Element aus Macro }
  941. Type Int =Record
  942.             Lobyte ,
  943.             Hibyte :Byte;
  944.           end;
  945. Var CalcValue :Int;
  946. begin
  947.   Fillchar(P,Sizeof(P),0);
  948.   ClearLibID(M);
  949.   With P Do
  950.   begin
  951.     Ebene:=M.ebene;
  952.     ElementTyp:=Schrift;
  953.     CalcValue.Hibyte:=M.PartX;
  954.     CalcValue.Lobyte:=Byte(M.Ltyp) shl 4;  {X-wert hat Lowbits in Bit 0..3}
  955.     Aufhaenger.X:=Integer(CalcValue) div 4;
  956.     CalcValue.Hibyte:=M.PartY;
  957.     CalcValue.Lobyte:=Byte(M.Ltyp) and $F0;  {Y-wert hat Lowbits in Bit 4..7}
  958.     Aufhaenger.Y:=Integer(CalcValue) div 4;
  959.     Hoehe:=Setupinfo.Voreinstellung.Masshoehe;
  960.     Art:=Setupinfo.EDSetup3.Masstyp;
  961.     Orient:=M.Textorient*5;
  962.     Str(M.PartNr,Wortlaut);
  963.     Wortlaut:=M.PartID+Wortlaut;
  964.   end;
  965. end;
  966.  
  967. Procedure ZeichneMAC(Var Objekt:Bildelement);
  968. Var Nmax    :Word;
  969.     DatF    :Datafile;
  970.     Obj1    :BildElement;
  971.     Macpar1 :Macparms;
  972.     Listpt  :Maclistptr;
  973.     Foundpt :Macptr;
  974.     Storeit :Boolean;
  975.     MacListName:Str10;
  976.     DummyDate,
  977.     NrOfBLDRecs,
  978.     Offset        :Longint;
  979.     Vers,Count,I  :Word;
  980.  
  981.  
  982. Const BildRecHeap=(Sizeof(Maclist) div 8)*8+8;
  983.  
  984. Begin
  985.   GetMacparms(Objekt,Macpar1);
  986.   If Not PartIDEmpty(Objekt) then { Wegmaskieren LIBID}
  987.   begin
  988.     MakePart(Objekt,Obj1);
  989.     Change(Obj1,Macpar1);
  990.     ZeichneaufBuf(Obj1,false);
  991.   end;
  992.   MacListName:=MacListStr(Objekt);
  993.   If SearchinList(MacListName,Nmax,Foundpt,Listpt) Then
  994.   While (Listpt<>nil) and (Nmax>0) Do
  995.   Begin
  996.     Nmax:=Pred(Nmax);
  997.     With Listpt^ Do
  998.     Begin
  999.       Obj1:=Entry;
  1000.       Change(Obj1,Macpar1);
  1001.       ZeichneaufBuf(Obj1,false);
  1002.       Listpt:=Next;
  1003.     End;
  1004.   End
  1005.   Else
  1006.   Begin
  1007.     Ok:=LocateMac(Objekt,MacroPath,DataF,DummyDate,Offset,Count);
  1008.     If Ok then Openfile(DatF,DataF);
  1009.     If Ok Then
  1010.      Begin
  1011.        If Count=$FFFF then
  1012.          NrOfBLDRecs:=UsedRecs(DatF) else NrOfBLDRecs:=Count;
  1013.        Storeit:=(Maxavail>1024) and (MemAvail >(NrOfBLDRecs*BildRecHeap+16384));
  1014.        If Storeit Then Entertolist(MacListName,Listpt);
  1015.        Nmax:=0;
  1016.        (*$I-*)
  1017.        Seek(DatF,Offset);
  1018.        OK:=IoResult=0;
  1019.        BlockRead(DatF,Obj1,1);
  1020.        OK:=Ok and (IoResult=0);
  1021.        Vers:=Defaults(Obj1).GEDVersion;
  1022.        FitVersionCode(Vers);
  1023.        I:=0;
  1024.        While Ok and Not(Eof(DatF)) and (I<Count) do
  1025.        Begin
  1026.          BlockRead(DatF,Obj1,1);
  1027.          Update_Obj(Obj1,Vers);
  1028.          Inc(I);
  1029.          Ok:=IoResult=0;
  1030.          If Ok and (Obj1.Status=0)
  1031.             and (Byte(Obj1.Elementtyp)<Byte(ED_CON1))  Then
  1032.            Begin
  1033.              Nmax:=Succ(Nmax);
  1034.              If Storeit Then EntertoMac(Obj1,Listpt);
  1035.              Change(Obj1,Macpar1);
  1036.              ZeichneaufBuf(Obj1,false);
  1037.            End;
  1038.        End;
  1039.        If Storeit Then Macroslast^.MaxRecs:=Nmax;
  1040.        CloseFile(DatF);
  1041.        (*$I+*)
  1042.      End
  1043.   Else
  1044.     Begin
  1045.       Zeichne(Objekt,DefMacparms);
  1046.       If Batch then
  1047.       begin
  1048.         FullScreen;
  1049.         Error(102);
  1050.       end;
  1051.       If
  1052.       SelectError('Macro '+Fullname_O(Objekt)+' nicht gefunden, Abbrechen ? (J/N)',
  1053.                   'Fehler:',['J','N',Esc]) ='J' Then
  1054.         Weiter:=false
  1055.       Else OK:=true;
  1056.     End;
  1057.   End;
  1058. End;
  1059.  
  1060. Procedure Title_Line(Y:Integer;S:Str80);
  1061. Var C :Byte;
  1062. begin
  1063.   If ModeCo80 then C:=CalcAttr(Crt.White,Crt.Blue)
  1064.     else C:=CalcAttr(Crt.black,Crt.LightGray);
  1065.   DisplayString(1,Y,C,Center(S,80));
  1066. end;
  1067.  
  1068. Procedure HeadLine(S:Str80);
  1069. begin
  1070.   Title_Line(1,S);
  1071. end;
  1072.  
  1073. Procedure Line25;
  1074. begin
  1075.   Title_Line(25,'<Pg-Up>-Fertig             <Cursor-Tasten>-Editieren');
  1076. end;
  1077.  
  1078.  
  1079. Procedure Escape;
  1080. Begin
  1081.   ErrorInit;
  1082.   Title_Line(25,'****   Esc-Taste --> Abbruch    ****');
  1083.   Delay(70*Delfac);
  1084. End;
  1085.  
  1086. Procedure InitPlotRes(Res:Real);
  1087. begin
  1088.   If Res<1E-3 then Res:=1E-3;
  1089.   PlotRes:=Res;InvPlotRes:=1.0/PlotRes;
  1090. end;
  1091.  
  1092. Procedure PlotInit;
  1093. Begin
  1094.  Devicename:='Plotter';
  1095.  IgnorePaperout:=true;
  1096.  With Setupinfo.SetupPlotter Do
  1097.   Begin
  1098.     Spiegeln:=false;
  1099.     Portrait:=false;
  1100.     AufDatei:=Outpath<>'';
  1101.     FensterX1:=MinFormX;FensterY1:=MinFormY;
  1102.     FensterX2:=FormX;FensterY2:=FormY;
  1103.     InitPlotRes(SetupInfo.PinstInfo.Resolution);
  1104.     Grafwindow(FensterX1,FensterY1,FensterX2,FensterY2);
  1105.     Turnto(0);
  1106.     PlotModus:=Standard;
  1107.     PlotSpeed:=Pspeed;
  1108.     HauptF:=FileSetup.DWG;
  1109.     LoetStopPlus:=0.0;
  1110.     Buffptr:=0;
  1111.     PlotModus:=Standard;
  1112.     StiftBreite:=0.1; { 0.1 mm = 0.1}
  1113.     PlotScale:=1.0;
  1114.     PlotOffset.X:=MinFormX;
  1115.     PlotOffset.Y:=MinFormY;
  1116.   end;
  1117.   With SetupInfo.PinstInfo Do
  1118.   begin
  1119.     Emul_LT:= (LtFullCom='') or (LtdashCom='') or (LTdotCom='');
  1120.            { Erzwingt Software-Emulation gestrichelter Linien !!! }
  1121.     If Emul_LT then LineScaleFac:=1.0;
  1122.     Lscaledashed:=5.0;
  1123.     Lscaledotted:=7.5;
  1124.     Endsym:=TermStr;
  1125.     ComInstalled:=(DrawCom<>'') and (MoveCom<>'');
  1126.   end;
  1127.   AdaptLines:=true;
  1128. End;
  1129.  
  1130. PROCEDURE Crea_men;
  1131.   TYPE txtarr    = ARRAY [1 .. 15] OF Str80;
  1132.   VAR  texte: txtarr;
  1133.        P,Lw,L :Byte;
  1134.        DWGing :Str64;
  1135.   BEGIN
  1136.     texte[1] := ' E~i~nstellungen';
  1137.     texte[2] := ' ~E~benen';
  1138.     texte[3] := ' Stift~b~reiten ';
  1139.     texte[4] := ' Plot~m~odus : ';
  1140.     texte[5] := ' ~P~lotten';
  1141.     texte[6] := ' FORMAT ~l~aden ';
  1142.     texte[7] := ' FORMAT ~s~peichern ';
  1143.     texte[8] := ' Format l~ö~schen ';
  1144.     P:=8;
  1145.     With FileSetUp Do
  1146.     begin
  1147.       DWGing:=DWG;
  1148.       ProcessFilename(DWGpath,DWGing);
  1149.       Lw:=Length(DWGing);
  1150.       L:=Length(LIBpath);
  1151.       IF Lw<L Then Lw:=L;
  1152.       Lw:=Lw+4;
  1153.       If Lw<28 then Lw:=28;
  1154.       MakeMenue(men_main,5,8,Lw,P+8,P,MainWinCol,MainFlpCol,MainHiCol,
  1155.                 Ptr(Seg(texte),Ofs(texte)),wok);
  1156.       WriteToWindow(men_main.picture,7,1,MainHeadCol,' Plot-Menü ');
  1157.       WriteToWindow(men_main.picture,1,P+2,MainWinCol,
  1158.                       '└'+ConstStr('─',Lw-2)+'┘');
  1159.       WriteToWindow(men_main.picture,3,P+2,MainHeadCol,
  1160.                     ' '+Chr(24)+Chr(25)+' wählen   <ESC> Ende ');
  1161.       WriteToWindow(men_main.picture,1,P+3,MainWinCol,
  1162.                       '┌'+ConstStr('─',Lw-2)+'┐');
  1163.  
  1164.       WriteToWindow(men_main.picture,3,P+4,MainNorCol,'Zeichnung :');
  1165.       WriteToWindow(men_main.picture,3,P+5,CopyWrCol,DWGing);
  1166.       WriteToWindow(men_main.picture,3,P+6,MainNorCol,'Bibliothek :');
  1167.       WriteToWindow(men_main.picture,3,P+7,MainLowCol,LIBpath);
  1168.     end;
  1169.     texte[1] := ' ~S~tandard-Plot';
  1170.     texte[2] := ' ~L~ötstopmaske';
  1171.     texte[3] := ' ~B~estückungsplan';
  1172.     texte[4] := ' ~T~est-Plot';
  1173.     P:=4;
  1174.     MakeMenue(men_Mode,10,12,30,P+2,P,ModeWinCol,ModeFlpCol,ModeHiCol,
  1175.           Ptr(Seg(texte),Ofs(texte)),wok);
  1176.     WriteToWindow(men_Mode.picture,7,1,ModeHeadCol,' PLOT-MODUS ');
  1177.     WriteToWindow(men_Mode.picture,3,P+2,ModeHeadCol,
  1178.                   ' '+Chr(24)+Chr(25)+' wählen   <ESC> Ende ');
  1179.   END;  (*  Crea_men  *)
  1180.  
  1181.